【网络连接】socket
认知
当实现不同服务器之间的通讯时,可以认为每个服务器的连接是通过一个or多个路由连接(感觉就像是一个中枢神经连接多个神经元),由路由进行分配,而TP/TCP定义了分配的原则,而socket是实现具体的操作(类似开关,决定连接的闭合)。
socket的本质是一个文件,其通过I/O操作,即打开文件--读写文件--关闭文件,实现数据or通讯的传递,其是基于Unix/Linux通信的。
函数
socket(int domain, int type, int protocol)
功能:打开创建一个连接关系
domain(family):协议域(协议族),主要决定socket的地址类型,理解就是通信的场景
- AF_INET(默认)服务器之间的网络通信
- AF_INET6:IPV6
- AF_LOCAL
- AF_UNIX:只能用于单一的unix的进程间的通信
type:指定socket类型,理解是数据传输的类型
- SOCK_STREAM(默认)流式,TCP
- SOCK_DGRAM:数据报式,UDP
- SOCK_RAW:原始套接字
- SOCK_PACKET:
- SOCK_SEQPACKET:可靠的连接数据报服务
protocol:指定协议,和type一起决定
- IPPROTO_TCP
- IPPTOTO_UDP
- IPPROTO_SCTP
- IPPROTO_TIPC
注:
- TCP发送数据时,已经建立好连接,无需指定地址;UDP每次发送指令都需要确定好发送给谁
- 建立连接时,type和protocol的组合不是随机的,而是固定的,protocol默认为0,按照type的选择决定适合的选择
- 创建socket,并未定义其具体的地址,必须通过bind函数赋予地址,而端口可以指定,也可以又系统随机分配
bind((host, port))
对象:服务端
功能:用于服务端绑定到地址,即服务器启动时,将该服务器绑定到一个固定的地址提供服务,客户可以通过访问这个地址来调用服务。这个地址的构成是 ip地址+端口
listen(backlog)
对象:服务端
功能:开始监听socket
backlog:操作系统可以最多进行几次连接操作,当超过这个次数,操作系统连接失败
accept()
对象:服务端
功能:在确定服务器开始监听某个特定地址后,接受TCP并获取客户端的地址,实现一个完整的建立。之后网络之间可以开始进行I/O操作了。
connect((host,port)) / connect_ex((host, port))
对象:客户端
功能:客户端可以连接到指定的服务器,包含 ip地址+端口
注:connect_ex((host, port))功能相同,但是在连接成功时返回0,否则返回errorno
recv(bufsize[,flag])
对象:服务端、客户端
功能:实现接收数据的操作~~
s.send(string[,flag])
对象:服务端、客户端
功能:实现发送数据的操作,返回值是发送数据的字节数量,可能会小于string的字节大小~~
详见链接:https://blog.csdn.net/rebelqsp/article/details/22109925